package com.kinyx.framework.db.dialect;

import java.util.List;

import com.kinyx.framework.annotation.assist.CanNotNull;
import com.kinyx.framework.annotation.assist.ReturnNotNull;
import com.kinyx.framework.db.sentence.str.SQL;

/**
 * 数据库方言（用于跨库实现）
 */
public abstract class Dialect {

	/** @return 数据库方言名 */
	@ReturnNotNull
	public String name() { return this.getClass().getSimpleName(); }

	/**
	 * 校验是否为该数据库方言的驱动类
	 * @param driverClassName 驱动类
	 * @return true：是该类型数据库的驱动类；false：不是该类型数据库的驱动类；
	 */
	@ReturnNotNull
	public abstract boolean checkDriverClassName(@CanNotNull final String driverClassName);

	/**
	 * 创建计数语句
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @return SQL语句对象
	 */
	@ReturnNotNull
	public SQL createCountSQL(@CanNotNull final String sql, @CanNotNull final List<Object> params) {
		final int startIdx = sql.toUpperCase().indexOf("FROM");
		return new SQL().addAll(params).s("SELECT COUNT(1) FROM" + sql.substring(startIdx + "FROM".length()));
	}

	/**
	 * 创建分页查询语句
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param pageNumber 页面编码
	 * @param pageSize 页面大小
	 * @return SQL语句对象
	 */
	@ReturnNotNull
	public abstract SQL createPageSQL(@CanNotNull final String sql, @CanNotNull final List<Object> params, @CanNotNull final int pageNumber, @CanNotNull final int pageSize);

}
